/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package manejadores;

import com.akcess.exception.*;
import com.akcess.vo.*;
import com.akcess.impl.*;
import com.akcess.dao.*;
import java.sql.*;
import java.util.*;

/**
 * Esta clase se utiliza para realizar las tareas relacionadas con la gestion de los Recursos de tipo Sala de Maquinas,
 * como creacion, borrado y modificacion de Salas, entre otras cosas.
 * @author Alejandro
 */
public class ManejadorSM {

    private Connection conexion = null;

    /**
     * Constructor de la Clase ManejadorSM que recibe una conexion a la BD.
     * @param con Conexion a la BD, el cual se utilizara como el unico atributo de esta clase. (Connection conexion)
     */
    public ManejadorSM(Connection con) {
        this.conexion = con;
    }

    /**
     * Crea un Recurso de tipo Sala_de_maquinas determinado en la BD.
     * @param recurso Es un objeto de tipo Recurso que contiene los datos del nuevo Recurso relacionados a la tabla Recurso. 
     * @param aula Representa la nueva aula que se esta agregando y contiene la informacion para la tabla Aulas.
     * @param sala Representa la nueva sala que se esta agregando y contiene la informacion para la tabla Sala_de_maquinas.
     * @param sistemas Contiene los Sistemas Operativos con que cuenta la sal nueva.
     * @throws com.akcess.exception.Sala_de_maquinasException Lanza excepciones del tipo AulasException, creada por el DAOGenerator.
     */
    public void CrearRecursoSM(Recurso recurso, Aulas aula, Sala_de_maquinas sala, Vector sistemas) throws Sala_de_maquinasException {
        try {

            int id_nuevoRecurso = 0;

            //Primero agregamos el nuevo recurso en la Tabla Recurso.
            RecursoDAOImpl manejadorRecurso = new RecursoDAOImpl();
            RecursoRecordCountDAOImpl manejadorContador = new RecursoRecordCountDAOImpl();
            RecursoRecordCount contador = manejadorContador.getRecordCount(this.conexion);
            int cantRegistros = contador.getCount();
            id_nuevoRecurso = 1 + cantRegistros;
            recurso.setId_recurso(id_nuevoRecurso);
            manejadorRecurso.insert(recurso, this.conexion);

            //Ahora agregamos el recurso nuevo a la tabla Aulas.
            AulasDAOImpl manejadorAulas = new AulasDAOImpl();
            aula.setId_recurso(id_nuevoRecurso);
            manejadorAulas.insert(aula, this.conexion);

            //Ahora agregamos el recurso nuevo a la tabla Sala_de_maquinas.
            Sala_de_maquinasDAOImpl manejadorSalas = new Sala_de_maquinasDAOImpl();
            sala.setId_sala(id_nuevoRecurso);
            manejadorSalas.insert(sala, this.conexion);

            //Ahora en la tabla Tiene_so ponemos los sistemas con que cuenta la sala.
            Tiene_soDAOImpl manejadorTieneSO = new Tiene_soDAOImpl();
            Tiene_so tieneSO = new Tiene_so();
            if (sistemas.size() != 0) {
                for (int i = 0; i < sistemas.size(); i++) {
                    So SO = (So) sistemas.get(i);
                    tieneSO.setId_sala(id_nuevoRecurso);
                    tieneSO.setId_so(SO.getId_so());
                    manejadorTieneSO.insert(tieneSO, this.conexion);
                }
            }
        } catch (AulasException ex) {
            ex.printStackTrace();
        } catch (RecursoException ex) {
            ex.printStackTrace();
        } catch (RecursoRecordCountException ex) {
            ex.printStackTrace();
        } catch (Tiene_soException ex) {
            ex.printStackTrace();
        }

    }

    /**
     * Realiza las modificaciones en la BD que fueron realizadas sobre un Recurso de Sala_de_maquinas determinado, realizando las modificaciones
     * en las Tablas Recurso, Sala_de_maquinas y Aulas.
     * @param recurso Representa el Recurso en la tabla Recurso que fue modificado.     
     * @param aula Representa el aula en la tabla Aulas que fue modificado.
     * @param sala Representa sala en la tabla Sala_de_maquinas que fue modificado.
     * @param sistemaNuevos Representan los sistemas Operativos que son modificados en la sala.
     * @throws com.akcess.exception.Sala_de_maquinasException Lanza excepciones del tipo AulasException, creada por el DAOGenerator.
     */
    public void ModificarRecursoSM(Recurso recurso, Aulas aula, Sala_de_maquinas sala, Vector sistemasNuevos) throws Sala_de_maquinasException {
        try {
            //Modificaciones en la tabla Aulas.
            AulasDAOImpl manejadorAulas = new AulasDAOImpl();
            AulasPK aulasPK = new AulasPK();
            aulasPK.setId_recurso(recurso.getId_recurso());
            manejadorAulas.update(aulasPK, aula, this.conexion);

            //Modificaciones en la tabla Recurso.
            RecursoDAOImpl manejadorRecurso = new RecursoDAOImpl();
            RecursoPK recursoPK = new RecursoPK();
            recursoPK.setId_recurso(recurso.getId_recurso());
            Recurso recursoOriginal = manejadorRecurso.findByPrimaryKey(recursoPK, this.conexion);
            recurso.setBorrado(recursoOriginal.getBorrado());
            recurso.setFechacreacion(recursoOriginal.getFechacreacion());
            manejadorRecurso.update(recursoPK, recurso, this.conexion);

            //Modificaciones en la tabla Sala_de_maquinas.
            Sala_de_maquinasDAOImpl manejadorSala = new Sala_de_maquinasDAOImpl();
            Sala_de_maquinasPK salaPK = new Sala_de_maquinasPK();
            salaPK.setId_sala(recurso.getId_recurso());
            manejadorSala.update(salaPK, sala, this.conexion);

            //Modificaciones en la tabla Tiene_so.
            Tiene_soDAOImpl manejadorTieneSO = new Tiene_soDAOImpl();
            Tiene_so tieneSO = new Tiene_so();
            Tiene_soPK tienePK = new Tiene_soPK();
            So[] sistemasViejos = this.ObtenerSO(recurso.getId_recurso());
            boolean band = false;
            int cont = 0;

            for (int i = 0; i < sistemasViejos.length; i++) {
                if (!sistemasNuevos.isEmpty()) {
                    for (int j = 0; j < sistemasNuevos.size(); j++) {
                        So SO = (So) sistemasNuevos.get(j);
                        if (sistemasViejos[i].getId_so() == SO.getId_so()) {
                            band = true;
                            cont = j;
                            break;
                        }
                    }
                }
                if (band) {
                    sistemasNuevos.remove(cont);
                    band = false;
                } else {
                    tienePK.setId_sala(sala.getId_sala());
                    tienePK.setId_so(sistemasViejos[i].getId_so());
                    manejadorTieneSO.delete(tienePK, this.conexion);
                }
            }

            if (!sistemasNuevos.isEmpty()) {
                for (int i = 0; i < sistemasNuevos.size(); i++) {
                    So SO = (So) sistemasNuevos.get(i);
                    tieneSO.setId_sala(recurso.getId_recurso());
                    tieneSO.setId_so(SO.getId_so());
                    manejadorTieneSO.insert(tieneSO, this.conexion);
                }
            }

        } catch (AulasException ex) {
            ex.printStackTrace();
        } catch (RecursoException ex) {
            ex.printStackTrace();
        } catch (SoException ex) {
            ex.printStackTrace();
        } catch (Tiene_soException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Obtiene todos los Recursos de tipo Sala_de_maquinas existentes en la BD.
     * @return Un vector de tipo RecursoSMCompleto, que contiene toda la informacion de cada Recurso de tipo Sala_de_maquinas.
     * @throws com.akcess.exception.Sala_de_maquinasException Lanza excepciones del tipo Recurso_humanoException, creada por el DAOGenerator.
     */
    public RecursoSMCompleto[] ListarRecursosSM() throws Sala_de_maquinasException {
        RecursoSMCompleto[] salas = null;
        try {
            Sala_de_maquinasDAOImpl salaDAO = new Sala_de_maquinasDAOImpl();
            salas = salaDAO.ObtenerRecursoCompleto(this.conexion);
        } catch (Sala_de_maquinasException ex) {
            ex.printStackTrace();
        }
        return salas;
    }

    /**
     * Realiza el borrado de la BD de un Recurso de tipo Sala_de_maquinas determinado.
     * @param idRecurso Contiene el id del Recurso que sera eliminado o borrado logicamente.
     * @throws com.akcess.exception.RecursoException Lanza excepciones del tipo RecursoException, creada por el DAOGenerator.
     */
    public void BorrarRecursoSM(int idRecurso) throws RecursoException {
        RecursoPK recursoPK = new RecursoPK();
        recursoPK.setId_recurso((long) idRecurso);
        RecursoDAOImpl manejadorRecurso = new RecursoDAOImpl();
        Recurso recurso = manejadorRecurso.findByPrimaryKey(recursoPK, this.conexion);
        recurso.setBorrado(true);
        int cantResultado = manejadorRecurso.borrar(recursoPK, this.conexion);
        if (cantResultado == 0) {
            throw new RecursoException("El recurso no puede ser borrado.. Hay dependencias");
        }
    }

    /**
     * Obtiene de la BD un Recurso de tipo Sala_de_maquinas determinado por un id de recurso.
     * @return El Recurso de tipo Sala_de_maquinas especificado por idRecurso.
     * @param idRecurso Contiene el id del Recurso que debera ser buscado.
     * @throws com.akcess.exception.Sala_de_maquinasException Lanza excepciones del tipo AulasException, creada por el DAOGenerator.
     */
    public RecursoSMCompleto ObtenerRecursoSM(int idRecurso) throws Sala_de_maquinasException {
        //Me conecto a la BD                   
        Sala_de_maquinasDAOImpl manejadorRecurso = new Sala_de_maquinasDAOImpl();
        RecursoSMCompleto recurso = manejadorRecurso.EncontrarRecursoCompleto(idRecurso, this.conexion);
        return recurso;
    }

    /**
     * Retorna todas la ubicaciones que se tiene en la Base de Datos.
     * @return Un vector de tipo Ubicacion que contiene todas las ubicaciones.
     * @throws com.akcess.exception.UbicacionException Lanza excepciones del tipo UbicacionException, creada por el DAOGenerator.
     */
    public Ubicacion[] ObtenerUbicaciones() throws UbicacionException {
        try {
            UbicacionDAOImpl ManagerUbi = new UbicacionDAOImpl();
            Ubicacion[] ubicaciones = ManagerUbi.findAll(this.conexion);
            return ubicaciones;
        } catch (UbicacionException ex) {
            ex.printStackTrace();
            return null;
        }
    }

    /**
     * Retorna todos los tipos de Sistemas Operativos existentes en la Base de Datos.
     * @return Un vector de tipo So que contiene todos los sistemas.
     * @throws com.akcess.exception.SoException Lanza excepciones del tipo SoException, creada por el DAOGenerator.
     */
    public So[] ObtenerSO() throws SoException {
        try {
            SoDAOImpl ManagerSo = new SoDAOImpl();
            So[] sistemas = ManagerSo.findAll(this.conexion);
            return sistemas;
        } catch (SoException ex) {
            ex.printStackTrace();
            return null;
        }
    }

    /**
     * Retorna todos los tipos de Sistemas Operativos existentes en la Base de Datos.
     * @return Un vector de tipo So que contiene todos los sistemas.
     * @throws com.akcess.exception.SoException Lanza excepciones del tipo SoException, creada por el DAOGenerator.
     */
    public So[] ObtenerSO(long idSala) throws SoException {
        try {
            SoDAOImpl ManagerSo = new SoDAOImpl();
            So[] sistemas = ManagerSo.EncontrarPorIdSala(idSala, this.conexion);
            return sistemas;
        } catch (SoException ex) {
            ex.printStackTrace();
            return null;
        }
    }

    /**
     * Retorna todos los Encargados de la sala dado un id de Sala existentes en la Base de Datos.
     * @return Un vector de tipo Tiene_encargados que contiene todos los encargados de la sala.
     * @throws com.akcess.exception.Tiene_encargadosException Lanza excepciones del tipo Tiene_encargados, creada por el DAOGenerator.
     */
    public Tiene_encargados[] ObtenerEncargados(long idSala) throws Tiene_encargadosException {
        try {
            Tiene_encargadosDAOImpl manejador = new Tiene_encargadosDAOImpl();
            Tiene_encargados[] encargados = manejador.ObtenerEncargados(idSala, this.conexion);
            return encargados;
        } catch (Tiene_encargadosException ex) {
            ex.printStackTrace();
            return null;
        }
    }
    
    /**
     * Realiza el borrado en la BD de un Encargado de una Sala determinada y en el turno dado.
     * @param idSala Contiene el id de la Sala cuyo encargado sera eliminado.
     * @param idEncargado Contiene el id del Encargado de la Sala que sera eliminado.
     * @param turno Contiene el turno (Mañana,Tarde o Noche) del encargado que sera eliminado.
     * @throws com.akcess.exception.RecursoException Lanza excepciones del tipo RecursoException, creada por el DAOGenerator.
     */
    public void BorrarEncargado(int idSala, int idEncargado, String turno) throws Tiene_encargadosException {
        //Me conecto a la BD           
        try {
            Tiene_encargadosPK encargadoPK = new Tiene_encargadosPK();
            encargadoPK.setId_sala((long)idSala);
            encargadoPK.setId_encargado((long)idEncargado);
            encargadoPK.setTurno(turno);
            Tiene_encargadosDAOImpl manejador = new Tiene_encargadosDAOImpl();
            manejador.delete(encargadoPK, this.conexion);
            
        } catch (Tiene_encargadosException ex) {
            ex.printStackTrace();
        }
    }
    
    /**
     * Asigna un nuevo Encargado a una sala especifica, es decir añade una fila a la Tabla Tiene_encargados.
     * @param Tiene_encargados Viene a ser el nuevo Encargado que sera insertado a la BD para una determinada Sala.
     * @throws com.akcess.exception.Tiene_encargadosException Lanza excepciones del tipo Tiene_encargadosException, creada por el DAOGenerator.
     */
    public void AsignarEncargado(Tiene_encargados encargado) throws Tiene_encargadosException{
     
             //Agrego a la base de datos el nuevo SO
            Tiene_encargadosDAOImpl manejador = new Tiene_encargadosDAOImpl();
            manejador.insert(encargado, this.conexion);
       
    }
}
